home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2000 September / september_2000.iso / intercd / root / ^Linux / WindowMaker / src / window.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-03-03  |  11.9 KB  |  399 lines

  1. /*
  2.  *  Window Maker window manager
  3.  * 
  4.  *  Copyright (c) 1997, 1998 Alfredo K. Kojima
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 
  19.  *  USA.
  20.  */
  21.  
  22. #ifndef WMWINDOW_H_
  23. #define WMWINDOW_H_
  24.  
  25. #include <wraster.h>
  26.  
  27. #include "wconfig.h"
  28. #include "GNUstep.h"
  29. #include "texture.h"
  30. #include "menu.h"
  31. #include "application.h"
  32.  
  33. /* not defined in my X11 headers */
  34. #ifndef UrgencyHint
  35. #define UrgencyHint (1L << 8)
  36. #endif
  37.  
  38.  
  39. #define BORDER_TOP    1
  40. #define BORDER_BOTTOM    2
  41. #define BORDER_LEFT    4
  42. #define BORDER_RIGHT    8
  43. #define BORDER_ALL    (1|2|4|8)
  44.  
  45.  
  46. #define CLIENT_EVENTS (StructureNotifyMask | PropertyChangeMask\
  47.     | EnterWindowMask | LeaveWindowMask | ColormapChangeMask \
  48.     | FocusChangeMask | VisibilityChangeMask)
  49.  
  50. typedef enum {
  51.     WFM_PASSIVE, WFM_NO_INPUT, WFM_LOCALLY_ACTIVE, WFM_GLOBALLY_ACTIVE
  52. } FocusMode;
  53.  
  54.  
  55. /*
  56.  * window attribute flags.
  57.  * 
  58.  * Note: attributes that should apply to the application as a
  59.  * whole should only access the flags from the app->main_window_desc->window_flags
  60.  * This is to make sure that the application doesn't have many different
  61.  * values for the same option. For example, imagine xfoo, which has 
  62.  * foo.bar as leader and it a child window named foo.baz. If you set
  63.  * StartHidden YES for foo.bar and NO for foo.baz we must *always* guarantee
  64.  * that the value that will be used will be that of the leader foo.bar.
  65.  * The attributes inspector must always save application wide options
  66.  * in the name of the leader window, not the child.
  67.  * 
  68.  */
  69. /*
  70.  * All flags must have their default values = 0
  71.  * 
  72.  * New flag scheme:
  73.  * 
  74.  * user_flags, defined_flags
  75.  * client_flags
  76.  * 
  77.  * if defined window_flag then window_flag else client_flag
  78.  * 
  79.  */
  80.  
  81. #define WFLAGP(wwin, FLAG)    ((wwin)->defined_user_flags.FLAG \
  82.                     ? (wwin)->user_flags.FLAG \
  83.                     : (wwin)->client_flags.FLAG)
  84.  
  85. #define WSETUFLAG(wwin, FLAG, VAL)    (wwin)->user_flags.FLAG = (VAL),\
  86.                     (wwin)->defined_user_flags.FLAG = 1
  87.  
  88. typedef struct {
  89.     /* OpenStep */
  90.     unsigned int no_titlebar:1;           /* draw titlebar? */
  91.     unsigned int no_resizable:1;
  92.     unsigned int no_closable:1;
  93.     unsigned int no_miniaturizable:1;
  94.     unsigned int no_border:1;           /* 1 pixel border around window */
  95. #ifdef XKB_BUTTON_HINT
  96.     unsigned int no_language_button:1;
  97. #endif
  98.  
  99.     /* decorations */
  100.     unsigned int no_resizebar:1;       /* draw the bottom handle? */
  101.     unsigned int no_close_button:1;    /* draw a close button? */
  102.     unsigned int no_miniaturize_button:1; /* draw an iconify button? */
  103.     
  104.     unsigned int broken_close:1;       /* is the close button broken? */
  105.  
  106.     /* ours */
  107.     unsigned int kill_close:1;           /* can't send WM_DELETE_WINDOW */
  108.  
  109.     unsigned int no_shadeable:1;
  110.     unsigned int omnipresent:1;
  111.     unsigned int skip_window_list:1;
  112.     unsigned int floating:1;           /* put in WMFloatingLevel */
  113.     unsigned int sunken:1;           /* put in WMSunkenLevel */
  114.     unsigned int no_bind_keys:1;       /* intercept wm kbd binds
  115.                     * while window is focused */
  116.     unsigned int no_bind_mouse:1;      /* intercept mouse events
  117.                     * on client area while window
  118.                     * is focused */
  119.     unsigned int no_hide_others:1;     /* hide window when doing hideothers */
  120.     unsigned int no_appicon:1;           /* make app icon */
  121.     
  122.     unsigned int dont_move_off:1;
  123.  
  124.     unsigned int no_focusable:1;
  125.     
  126.     unsigned int always_user_icon:1;   /* ignore client IconPixmap or
  127.                     * IconWindow */
  128.  
  129.     unsigned int start_miniaturized:1;
  130.     unsigned int start_hidden:1;
  131.     unsigned int start_maximized:1;
  132.     unsigned int dont_save_session:1;  /* do not save app's state in session */
  133.  
  134.     unsigned int full_maximize:1;
  135.  
  136.     /*
  137.      * emulate_app_icon must be automatically disabled for apps that can
  138.      * generate their own appicons and for apps that have no_appicon=1
  139.      */
  140.     unsigned int emulate_appicon:1;
  141.  
  142.     /* toolkit specific attribute flags. These are unchangeable and
  143.      * unconfigurable and must not be saved as state. */
  144. #ifdef OLWM_HINTS
  145.     unsigned int olwm_transient:1;
  146.     unsigned int olwm_warp_to_pin:1;
  147. #endif
  148. } WWindowAttributes;
  149.  
  150.  
  151.  
  152. /*
  153.  * Window manager protocols that both the client as we understand.
  154.  */
  155. typedef struct {
  156.     unsigned int TAKE_FOCUS:1;
  157.     unsigned int DELETE_WINDOW:1;
  158.     unsigned int SAVE_YOURSELF:1;
  159.     /* WindowMaker specific */
  160.     unsigned int MINIATURIZE_WINDOW:1;
  161. #ifdef MONITOR_HEARTBEAT 
  162.     unsigned int HEARTBEAT:1;
  163. #endif
  164. } WProtocols;
  165.  
  166.  
  167. /*
  168.  * Stores client window information. Each client window has it's
  169.  * structure created when it's being first mapped.
  170.  */
  171. typedef struct WWindow {
  172.     struct WWindow *prev;           /* window focus list */
  173.     struct WWindow *next;
  174.  
  175.     WScreen *screen_ptr;           /* pointer to the screen structure */
  176.     WWindowAttributes user_flags;      /* window attribute flags set by user */
  177.     WWindowAttributes defined_user_flags;/* mask for user_flags */
  178.     WWindowAttributes client_flags;    /* window attribute flags set by app
  179.                     * initialized with global defaults */
  180.  
  181.     struct InspectorPanel *inspector;  /*  pointer to attribute editor panel */
  182.  
  183.     struct WFrameWindow *frame;           /* the frame window */
  184.     int frame_x, frame_y;           /* position of the frame in root*/
  185.  
  186.     struct {
  187.     int x, y;
  188.     unsigned int width, height;    /* original geometry of the window */
  189.     } old_geometry;               /* (before things like maximize) */
  190.  
  191.     /* client window info */
  192.     short old_border_width;           /* original border width of client_win*/
  193.     Window client_win;               /* the window we're managing */
  194.     WObjDescriptor client_descriptor; /* dummy descriptor for client */
  195.     struct {
  196.     int x, y;               /* position of *client* relative 
  197.                     * to root */
  198.     unsigned int width, height;    /* size of the client window */
  199.     } client;
  200.  
  201.     XSizeHints *normal_hints;           /* WM_NORMAL_HINTS */
  202.     XWMHints *wm_hints;               /* WM_HINTS (optional) */
  203.     char *wm_instance;               /* instance of WM_CLASS */
  204.     char *wm_class;                   /* class of WM_CLASS */
  205.     GNUstepWMAttributes *wm_gnustep_attr;/* GNUstep window attributes */
  206.  
  207.     int state;                   /* state as in ICCCM */
  208.     
  209.     Window transient_for;           /* WM_TRANSIENT_FOR */
  210.     Window group_id;               /* the leader window of the group */
  211.     Window client_leader;           /* WM_CLIENT_LEADER if not
  212.                     internal_window */
  213.  
  214.     Window main_window;               /* main window for the application */
  215.       
  216.     int cmap_window_no;
  217.     Window *cmap_windows;
  218.     
  219.     /* protocols */
  220.     WProtocols protocols;           /* accepted WM_PROTOCOLS */
  221.     
  222.     FocusMode focus_mode;           /* type of keyboard input focus */
  223.  
  224. #ifdef OLWM_HINTS_unfinished
  225.     struct WOLWindowState ol_window_state;
  226. #endif
  227.  
  228.     long event_mask;               /* the event mask thats selected */
  229.  
  230. #ifdef MONITOR_HEARTBEAT
  231.     time_t last_beat;
  232. #endif
  233.     struct {
  234.     /* state flags */
  235.     unsigned int mapped:1;    
  236.     unsigned int focused:1;
  237.     unsigned int miniaturized:1;
  238.     unsigned int hidden:1;
  239.     unsigned int shaded:1;
  240.     unsigned int maximized:2;
  241.     unsigned int omnipresent:1;
  242.  
  243.     unsigned int semi_focused:1;
  244.     /* window type flags */
  245.     unsigned int urgent:1;           /* if wm_hints says this is urgent */
  246. #ifdef SHAPE
  247.     unsigned int shaped:1;
  248. #endif
  249.  
  250.     /* info flags */
  251.     unsigned int is_gnustep:1;     /* 1 if the window belongs to a GNUstep
  252.                     app */
  253.     
  254.     unsigned int buttons_dont_fit:1;
  255.     unsigned int rebuild_texture:1;/* the window was resized and 
  256.                     * gradients should be re-rendered */
  257.     unsigned int needs_full_repaint:1;/* does a full repaint of the 
  258.                        * window next time it's painted */
  259.     unsigned int icon_moved:1;     /* icon for this window was moved
  260.                     * by the user */
  261.     unsigned int selected:1;       /* multiple window selection */
  262.     unsigned int skip_next_animation:1;
  263.     unsigned int internal_window:1;
  264.     unsigned int changing_workspace:1;
  265.  
  266.         unsigned int inspector_open:1; /* attrib inspector is already open */
  267.  
  268.     unsigned int destroyed:1;      /* window was already destroyed */
  269.  
  270.     unsigned int menu_open_for_me:1;   /* window commands menu */
  271.  
  272.     unsigned int waiting_save_ack:1;   /* waiting for SAVE_YOURSELF ack */
  273.  
  274.     unsigned int obscured:1;       /* window is obscured */
  275.  
  276.     unsigned int dragged_while_fmaximized;
  277.  
  278.     unsigned int user_changed_width:1;
  279.     unsigned int user_changed_height:1;
  280.     unsigned int wm_name_changed:1;
  281.  
  282. #ifdef KWM_HINTS
  283.     unsigned int kwm_hidden_for_modules:1;
  284.     unsigned int kwm_managed:1;
  285.     unsigned int kwm_menubar:1;
  286. #endif
  287. #ifdef OLWM_HINTS
  288.     unsigned int olwm_push_pin_out:1;/* emulate pushpin behaviour */
  289.     unsigned int olwm_limit_menu:1;
  290. #endif
  291.     } flags;        /* state of the window */
  292.  
  293.     struct WIcon *icon;               /* icon info for the window */
  294.     int icon_x, icon_y;               /* position of the icon */
  295. } WWindow;
  296.  
  297.  
  298. #define IS_OMNIPRESENT(w) ((w)->flags.omnipresent ^ WFLAGP(w, omnipresent))
  299.  
  300. #define WINDOW_LEVEL(w) ((w)->frame->core->stacking->window_level)
  301.  
  302.  
  303.  
  304. /*
  305.  * Changes to this must update wWindowSaveState/getSavedState
  306.  * 
  307.  */
  308. typedef struct WSavedState {
  309.     int workspace;
  310.     int miniaturized;
  311.     int shaded;
  312.     int hidden;
  313.     int use_geometry;
  314.     int x;
  315.     int y;
  316.     unsigned int w;
  317.     unsigned int h;
  318.     unsigned window_shortcuts; /* mask like 1<<shortcut_number */
  319. } WSavedState;
  320.  
  321.  
  322. typedef struct WWindowState {
  323.     char *instance;
  324.     char *class;
  325.     char *command;
  326.     pid_t pid;
  327.     WSavedState *state;
  328.     struct WWindowState *next;
  329. } WWindowState;
  330.  
  331.  
  332. typedef void* WMagicNumber;
  333.  
  334.  
  335.  
  336. void wWindowDestroy(WWindow *wwin);
  337. WWindow *wWindowCreate();
  338.  
  339. #ifdef SHAPE
  340. void wWindowSetShape(WWindow *wwin);
  341. void wWindowClearShape(WWindow *wwin);
  342. #endif
  343.  
  344. WWindow *wManageWindow(WScreen *scr, Window window);
  345.  
  346. void wUnmanageWindow(WWindow *wwin, Bool restore, Bool destroyed);
  347.  
  348. void wWindowFocus(WWindow *wwin, WWindow *owin);
  349. void wWindowUnfocus(WWindow *wwin);
  350. void wWindowConstrainSize(WWindow *wwin, int *nwidth, int *nheight);
  351. void wWindowConfigure(WWindow *wwin, int req_x, int req_y, 
  352.               int req_width, int req_height);
  353.  
  354. void wWindowMove(WWindow *wwin, int req_x, int req_y);
  355.  
  356. void wWindowSynthConfigureNotify(WWindow *wwin);
  357.  
  358. WWindow *wWindowFor(Window window);
  359.  
  360.  
  361. void wWindowConfigureBorders(WWindow *wwin);
  362.  
  363. void wWindowUpdateButtonImages(WWindow *wwin);
  364.  
  365. void wWindowSaveState(WWindow *wwin);
  366.  
  367. void wWindowChangeWorkspace(WWindow *wwin, int workspace);
  368.  
  369. void wWindowSetKeyGrabs(WWindow *wwin);
  370.  
  371. void wWindowResetMouseGrabs(WWindow *wwin);
  372.  
  373. WWindow *wManageInternalWindow(WScreen *scr, Window window, Window owner,
  374.                    char *title, int x, int y, 
  375.                    int width, int height);
  376.  
  377. void wWindowSetupInitialAttributes(WWindow *wwin, int *level, int *workspace);
  378.  
  379. void wWindowUpdateGNUstepAttr(WWindow *wwin, GNUstepWMAttributes *attr);
  380.  
  381. void wWindowMap(WWindow *wwin);
  382.  
  383. void wWindowUnmap(WWindow *wwin);
  384.  
  385. Bool wWindowCanReceiveFocus(WWindow *wwin);
  386.  
  387. void wWindowDeleteSavedStatesForPID(pid_t pid);
  388.  
  389. WMagicNumber wWindowAddSavedState(char *instance, char *class, char *command,
  390.                                   pid_t pid, WSavedState *state);
  391.  
  392. WMagicNumber wWindowGetSavedState(Window win);
  393.  
  394. void wWindowDeleteSavedState(WMagicNumber id);
  395.  
  396. Bool wWindowObscuresWindow(WWindow *wwin, WWindow *obscured);
  397.  
  398. #endif
  399.